package com.wwj.server.codc;

import com.wwj.server.model.Message;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * 数据包解码器
 * <pre>
 * 数据包格式
 * +——-----——+——-----——+
 * |   长度   |   数据   |
 * +——-----——+——-----——+
 * </pre>
 * 长度4字节(数据部分占有字节数量)
 *
 * @author tysci
 */
public class MessageDecoder extends ByteToMessageDecoder {

    /**
     * 数据包基本长度
     */
    public static int BASE_LENGTH = 4;


    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List<Object> out) throws Exception {

        while (true) {
            if (buffer.readableBytes() >= BASE_LENGTH) {
                //第一个可读数据包的起始位置
                int beginIndex;

                while (true) {
                    //包头开始游标点
                    beginIndex = buffer.readerIndex();
                    //标记初始读游标位置
                    buffer.markReaderIndex();
                    if (buffer.readInt() >= BASE_LENGTH)
                        break;
                }
                buffer.resetReaderIndex();
               //读取数据长度
                int length = buffer.readInt();
                if (length < 0) {
                    ctx.channel().close();
                }
                //数据包还没到齐
                if (buffer.readableBytes() < length - BASE_LENGTH) {
                    buffer.readerIndex(beginIndex);
                    return;
                }

                //读数据部分
                byte[] data = new byte[length - BASE_LENGTH];
                buffer.readBytes(data);

                Message message = new Message();
                message.setData(data);
                //解析出消息对象，继续往下面的handler传递
                out.add(message);
            } else {
                break;
            }
        }

        //数据不完整，等待完整的数据包
        return;
    }
}
